From 53984e38be3e657a7fc6f21f39c61a759a59677b Mon Sep 17 00:00:00 2001 From: "maf46@burn.cl.cam.ac.uk" Date: Fri, 18 Feb 2005 14:57:26 +0000 Subject: [PATCH] bitkeeper revision 1.1205.1.5 (42160256WLh3PYM-V5i-QJliGUxICA) Added a toggle so that debugtrace_printk's can be redirected to the console or to their own private buffer. --- xen/common/keyhandler.c | 5 +++- xen/drivers/char/console.c | 52 +++++++++++++++++++++++++------------- xen/include/xen/lib.h | 12 ++++----- 3 files changed, 45 insertions(+), 24 deletions(-) diff --git a/xen/common/keyhandler.c b/xen/common/keyhandler.c index 4615588cb6..2ef722afe0 100644 --- a/xen/common/keyhandler.c +++ b/xen/common/keyhandler.c @@ -158,7 +158,10 @@ void do_debug_key(unsigned char key, struct xen_regs *regs) #ifndef NDEBUG void debugtrace_key(unsigned char key) { - debugtrace_dump(); + static int send_to_console = 0; + + send_to_console = !send_to_console; + debugtrace_dump(send_to_console); } #endif diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c index b513520703..aa487cceae 100644 --- a/xen/drivers/char/console.c +++ b/xen/drivers/char/console.c @@ -479,23 +479,35 @@ void console_force_lock(void) static unsigned char *debugtrace_buf; /* Debug-trace buffer */ static unsigned int debugtrace_prd; /* Producer index */ static unsigned int debugtrace_kilobytes = 128, debugtrace_bytes; +static int debugtrace_send_to_console = 0; static spinlock_t debugtrace_lock = SPIN_LOCK_UNLOCKED; integer_param("debugtrace", debugtrace_kilobytes); -void debugtrace_reset(void) -{ - unsigned long flags; - spin_lock_irqsave(&debugtrace_lock, flags); +static void _debugtrace_reset(int send_to_console) +{ + if (send_to_console) + printk("debugtrace_printk now writting to console\n"); + else + printk("debugtrace_printk now writting to buffer\n"); if ( debugtrace_bytes != 0 ) memset(debugtrace_buf, '\0', debugtrace_bytes); + debugtrace_prd = 0; + debugtrace_send_to_console = send_to_console; +} +void debugtrace_reset(int send_to_console) +{ + unsigned long flags; + + spin_lock_irqsave(&debugtrace_lock, flags); + _debugtrace_reset(send_to_console); spin_unlock_irqrestore(&debugtrace_lock, flags); } -void debugtrace_dump(void) +void debugtrace_dump(int send_to_console) { int _watchdog_on = watchdog_on; @@ -514,8 +526,7 @@ void debugtrace_dump(void) debugtrace_buf[debugtrace_prd] = '\0'; serial_puts(sercon_handle, &debugtrace_buf[0]); - memset(debugtrace_buf, '\0', debugtrace_bytes); - debugtrace_prd = 0; + _debugtrace_reset(send_to_console); spin_unlock(&debugtrace_lock); @@ -537,15 +548,22 @@ void debugtrace_printk(const char *fmt, ...) va_start(args, fmt); (void)vsnprintf(buf, sizeof(buf), fmt, args); - va_end(args); + va_end(args); - for ( p = buf; *p != '\0'; p++ ) + if (debugtrace_send_to_console) { - debugtrace_buf[debugtrace_prd++] = *p; - - /* always leave a null byte at the end of the buffer */ - if (debugtrace_prd == debugtrace_bytes-1) - debugtrace_prd = 0; + serial_puts(sercon_handle, buf); + } + else + { + for ( p = buf; *p != '\0'; p++ ) + { + debugtrace_buf[debugtrace_prd++] = *p; + + /* always leave a null byte at the end of the buffer */ + if (debugtrace_prd == debugtrace_bytes-1) + debugtrace_prd = 0; + } } spin_unlock_irqrestore(&debugtrace_lock, flags); @@ -568,7 +586,7 @@ static int __init debugtrace_init(void) debugtrace_buf = (unsigned char *)alloc_xenheap_pages(order); ASSERT(debugtrace_buf != NULL); - memset(debugtrace_buf, '\0', debugtrace_bytes); + debugtrace_reset(0); return 0; } @@ -593,6 +611,8 @@ void panic(const char *fmt, ...) unsigned long flags; extern void machine_restart(char *); + debugtrace_dump(0); + va_start(args, fmt); (void)vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); @@ -611,8 +631,6 @@ void panic(const char *fmt, ...) __putstr("Reboot in five seconds...\n"); spin_unlock_irqrestore(&console_lock, flags); - debugtrace_dump(); - mdelay(5000); machine_restart(0); } diff --git a/xen/include/xen/lib.h b/xen/include/xen/lib.h index 4b274e1975..eda62214af 100644 --- a/xen/include/xen/lib.h +++ b/xen/include/xen/lib.h @@ -7,8 +7,8 @@ #include #define BUG() do { \ + debugtrace_dump(0); \ printk("BUG at %s:%d\n", __FILE__, __LINE__); \ - debugtrace_dump(); \ FORCE_CRASH(); \ } while ( 0 ) @@ -28,13 +28,13 @@ struct domain; void cmdline_parse(char *cmdline); #ifndef NDEBUG -extern void debugtrace_reset(void); -extern void debugtrace_dump(void); +extern void debugtrace_reset(int send_to_console); +extern void debugtrace_dump(int send_to_console); extern void debugtrace_printk(const char *fmt, ...); #else -#define debugtrace_reset() ((void)0) -#define debugtrace_dump() ((void)0) -#define debugtrace_printk(_f, ...) ((void)0) +#define debugtrace_reset(_send_to_console) ((void)0) +#define debugtrace_dump(_send_to_console) ((void)0) +#define debugtrace_printk(_f, ...) ((void)0) #endif #define printk printf -- 2.30.2